<html><head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8"><title>Module</title></head>
<body bgcolor="#EFF1F0" link="#3A3966" vlink="#000000" alink="#000000">
<font face="Verdana, sans-serif" size="2"><p align="center"><b><font size="5">Module</font></b></p>

<br><b>语法</b><blockquote><pre><font face="Courier New, Courier, mono"size="2"><b><font color="#3A3966">DeclareModule</font></b> &lt;name&gt;
  ...
<b><font color="#3A3966">EndDeclareModule</font></b>

<b><font color="#3A3966">Module</font></b> &lt;name&gt;
  ...
<b><font color="#3A3966">EndModule</font></b>

<b><font color="#3A3966">UseModule</font></b> &lt;name&gt;
<b><font color="#3A3966">UnuseModule</font></b> &lt;name&gt;
</font></pre></blockquote>
<b>概要</b><br><blockquote>


模块是一种简单的(与主代码)代码隔离手段，允许引用和共享而无须担心代码重名的冲突。在有些编程语言中，模块被称为“命名空间”。模块必须由 <b><font color="#3A3966">DeclareModule</font></b> 部分 (即公共接口) 和相关联的 <b><font color="#3A3966">Module</font></b> 部分 (即代码实现或叫执行)。只有在<b><font color="#3A3966">DeclareModule</font></b>部分内声明的项（成员）才可以从模块外部访问。而在<b><font color="#3A3966">Module</font></b>部分内的所有代码，将都严格保护在模块内部。主要代码项目像程序、变量等即使是<a href="global.html">全局 global</a>声明过，也不能访问模块内部。对于主程代码来说，模块可以看作是沙盒，空空如野的代码表的项目名称不会与主代码引起冲突。这使得它更易于编写一些指定的代码，而不用考虑可以重复的简单名称会在模块中发生冲突的风险。<br><br> <b><font color="#3A3966">DeclareModule</font></b> 部分中允许以下项目（成员） ：函数(仅允许函数声明)、结构、宏、变量、常量、举枚、数组、链表、映射和签标。<br><br>若要从外部模块访问的模块项目（成员）时，必须在前面加指定模块名称和“::”符号。一旦确定模块名后，就可以在任何地方使用其项目成员，即使是在其它模块中。<b> <font color="#3A3966">DeclareModule</font></b>部分中的所有项目成员都可以被另一个模块或使用<b><font color="#3A3966">UseModule</font></b>的主要代码自动导入。在这种情况下，如果模块名称冲突（重名），模块项目（成员）不会被导入，并会引发编译器错误提示。<b><font color="#3A3966">UnuseModule</font></b> 移除模块项目（成员）。使用<b><font color="#3A3966">UseModule</font></b> 无需强制性地访问模块项目（成员），但必须要指定模块名称。<br><br>如果需要模块之间的信息共享，可以创建一个公共模块，然后在每个需要它的模块中使用这个通用模块。这是可用于所有模块的全局数据的常用方法。<br><br>模块项目（成员）默认支持所有的 PureBasic 命令、结构、常量，因此模块项目（成员）不能被命名为 PureBasic 内置的命令、结构、常量。<br><br>当进程流运行到模块时，内置在 <b><font color="#3A3966">DeclareModule</font></b> 和 <b><font color="#3A3966">Module</font></b> 部分中的所有代码都会被执行，就像其他代码一样。<br><br>在模块内使用 <b><font color="#3A3966">Define</font></b>, <b><font color="#3A3966">EnableExplicit</font></b>, <b><font color="#3A3966">EnableASM</font></b> 作声明时，是用于模块内部，不会影响到个部模块，反之亦然。<br><br>注意︰ PureBasic 不是强制性的使用模块  但当创建大项目时建议使用。他有助于构建易于维护的代码，即使它是比无模块的代码稍微显得有些累赘。使用 <b><font color="#3A3966">DeclareModule</font></b> 部分创建的模块，在自己重新使用或共享他人引用时更容易被理解。 

</blockquote><p><b>示例</b></p><blockquote>


<pre><font face="Courier New, Courier, mono"size="2">  
  <font color="#3A3966">; 此部分的任意一个项目成员都可以被外部获取</font>
  <font color="#3A3966">;</font>
  <b><font color="#3A3966">DeclareModule</font></b> Ferrari
    <font color="#924B72">#FerrariName$</font> = "458 Italia"
    
    <b><font color="#3A3966">Declare</font></b> <font color="#3A3966">CreateFerrari</font>()
  <b><font color="#3A3966">EndDeclareModule</font></b>
  
  <font color="#3A3966">; 本部分内的任意一个项目（成员）均为私有，其外部即使重名，也不会引起冲突。</font>
  <font color="#3A3966">;</font>
  <b><font color="#3A3966">Module</font></b> Ferrari
    
    <b><font color="#3A3966">Global</font></b> Initialized = <font color="#924B72">#False</font>
    
    <b><font color="#3A3966">Procedure</font></b> <font color="#3A3966">Init</font>() <font color="#3A3966">; Private init procedure</font>
      <b><font color="#3A3966">If</font></b> Initialized = <font color="#924B72">#False</font>
        Initialized = <font color="#924B72">#True</font>
        <b><font color="#3A3966">Debug</font></b> "InitFerrari()"
      <b><font color="#3A3966">EndIf</font></b>
    <b><font color="#3A3966">EndProcedure</font></b>
      
    <b><font color="#3A3966">Procedure</font></b> <font color="#3A3966">CreateFerrari</font>()
<font color="#3A3966">      Init</font>()
      <b><font color="#3A3966">Debug</font></b> "CreateFerrari()"
    <b><font color="#3A3966">EndProcedure</font></b>
    
  <b><font color="#3A3966">EndModule</font></b>
  

  <b><font color="#3A3966">Procedure</font></b> <font color="#3A3966">Init</font>() <font color="#3A3966">; Main init procedure, doesn't conflict with the Ferrari Init() procedure</font>
    <b><font color="#3A3966">Debug</font></b> "Main init()"
  <b><font color="#3A3966">EndProcedure</font></b>
  
<font color="#3A3966">  Init</font>()
  
  Ferrari::<font color="#3A3966">CreateFerrari</font>()
  <b><font color="#3A3966">Debug</font></b> Ferrari::<font color="#924B72">#FerrariName$</font>
  
  <b><font color="#3A3966">Debug</font></b> "------------------------------"
  
  <b><font color="#3A3966">UseModule</font></b> Ferrari <font color="#3A3966">; 现在，直接在主程序范围内接入所有公共项目（成员）</font>
  
<font color="#3A3966">  CreateFerrari</font>()
  <b><font color="#3A3966">Debug</font></b> <font color="#924B72">#FerrariName$</font>

</font></pre>

</blockquote><p><b>Example:</b> With a common module</p><blockquote>


<pre><font face="Courier New, Courier, mono"size="2">  
  <font color="#3A3966">; 公共模块可以用来共享数据</font>
  <font color="#3A3966">;</font>
  <b><font color="#3A3966">DeclareModule</font></b> Cars
    <b><font color="#3A3966">Global</font></b> NbCars = 0
  <b><font color="#3A3966">EndDeclareModule</font></b>
  
  <b><font color="#3A3966">Module</font></b> Cars
  <b><font color="#3A3966">EndModule</font></b>
  
  <font color="#3A3966">; First car module</font>
  <font color="#3A3966">;</font>
  <b><font color="#3A3966">DeclareModule</font></b> Ferrari
  <b><font color="#3A3966">EndDeclareModule</font></b>
  
  <b><font color="#3A3966">Module</font></b> Ferrari
    <b><font color="#3A3966">UseModule</font></b> Cars
    
    NbCars+1
  <b><font color="#3A3966">EndModule</font></b>
  
  <font color="#3A3966">; Second car module</font>
  <font color="#3A3966">;</font>
  <b><font color="#3A3966">DeclareModule</font></b> Porche
  <b><font color="#3A3966">EndDeclareModule</font></b>
  
  <b><font color="#3A3966">Module</font></b> Porche
    <b><font color="#3A3966">UseModule</font></b> Cars
    
    NbCars+1
  <b><font color="#3A3966">EndModule</font></b>
  
  <b><font color="#3A3966">Debug</font></b> Cars::NbCars

</font></pre>

</body></html>